#pragma once

#include <map>
#include <string>
#include "glad/glad.h"
#include "GLFW/glfw3.h"
#include "Alice/Resource/Shader.h"
#include "Alice/Resource/Texture2D.h"

namespace Alice
{

/*
    资源管理器
    这是一个工具类
    负责加载和管理游戏资源
*/
class ResourceMngr
{
public:
    // 存储着色器和纹理
    std::map<std::string, Shader> shaders;
    std::map<std::string, Texture2D> textures;

    /*
        加载着色器资源
        \param name                 着色器的名称
        \param vertex_shader_file   顶点着色器文件路径
        \param fragment_shader_file 片段着色器文件路径
        \param geometry_shader_file 几何着色器文件路径
    */
    Shader& LoadShader(
        std::string name,
        const char* vertex_shader_file,
        const char* fragment_shader_file,
        const char* geometry_shader_file = nullptr
    );

    /*
        通过名称获取一个着色器
    */
    Shader& GetShader(std::string name);

    /*
        加载纹理资源
        \param name       资源全局唯一名称
        \param image_file 图片文件路径
    */
    Texture2D& LoadTexture(std::string name, const char* image_file);

    /*
        通过名称获取一个纹理
    */
    Texture2D& GetTexture(std::string name);

    /*
        清理所有资源
    */
    void Clear();

private:
    /*
        向用户隐藏的方法
        供公共方法调用
        加载着色器，加载纹理，并使用公共方法传入的名称记录下资源
    */
    Shader LoadShaderFromFile(
        std::string name,
        const char* vertex_shader_file,
        const char* fragment_shader_file,
        const char* geometry_shader_file = nullptr
    );
    
    Texture2D LoadTextureFromFile(
        const char* image_file
    );

};

} // namespace Alice
